<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // js 数据类型有哪些
    /**
     * 基本数据类型: number string null undefined symbol boolen bigint
     * 引用数据类型: object
    */
   /**
    * 基本数据类型： 存储在在栈中，因为基本数据类型占用空间小、大小固定，通过值来访问，属于被频繁使用的数据。
    * 引用数据类型：存储在堆中，引用数据类型占据空间大、大小不固定，如果存储在栈中，将影响程序的运行性能。
    * 引用数据类型会在栈中存储一个指针，这个指针指向堆内存空间中该实体的起始地址。
    * 当解释器寻找引用值时，会先检索其在栈中的地址，取得地址后，从堆中获得实体
    * 
    * 在 JavaScript 中，基本数据类型和引用数据类型有以下区别：

1. **存储方式：**
   - **基本数据类型：** 存储在栈内存中，它们的值直接存储在变量访问的位置上。
   - **引用数据类型：** 存储在堆内存中，变量中保存的是对象在堆内存中的引用地址，而不是实际的值。

2. **复制方式：**
   - **基本数据类型：** 在赋值操作时，会创建一个新的值并将其复制给目标变量，修改其中一个变量的值不会影响另一个变量的值。
   - **引用数据类型：** 在赋值操作时，复制的是引用地址，而不是实际的对象，因此两个变量实际上指向同一个对象，修改其中一个变量的值会影响另一个变量。

3. **比较方式：**
   - **基本数据类型：** 使用值比较（值相等）。
   - **引用数据类型：** 使用引用地址比较，只有当两个变量引用的是同一个对象时，它们才相等。

4. **传递方式：**
   - **基本数据类型：** 作为参数传递时，复制值给参数，函数内部的操作不会影响外部变量。
   - **引用数据类型：** 作为参数传递时，复制引用地址给参数，函数内部的操作可能会影响外部对象。

5. **内存管理：**
   - **基本数据类型：** 由 JavaScript 引擎自动管理内存，变量在作用域结束时自动销毁。
   - **引用数据类型：** 需要手动管理内存，当对象不再被引用时，需要通过垃圾回收机制将其回收。

基本数据类型和引用数据类型在 JavaScript 中的不同特性和使用方式，使得它们适用于不同的场景和需求。因此，在编写 JavaScript 代码时，需要根据具体的情况选择合适的数据类型。
   */
   console.log(true + 1) // 2
   console.log('name' + true) // nametrue 字符串和其他类型相加，都会变成字符串
   console.log(undefined + true) // NAN 它是一个数值类型，但不是一个具体的数字
   console.log(typeof null) // object
   console.log(typeof undefined) // undefined
</script>
</html>